<?

require_once dirname(__FILE__)."/conexao.php";

/**
* @TODO este teste seria melhor se fosse implementado como uma "User Storie"
*/
class TestSalvar extends Qi_Test_Db_MySql
{
	private $tabela = "pessoas";

	protected function mainSetup()
	{
		Qi_Db_Def::criar_tabela($this->tabela)->
			id()->
			string("nome", "email")->
		end();
		$this->pessoa = array(
			"id" => 2,
			"nome" => "marcos",
			"email" => "@"
		);
	}

	function test_ao_inserir_deve_retornar_o_id_gerado()
	{
		$id = Qi_Db::salvar($this->tabela, $this->pessoa);
		$this->assertEquals($this->pessoa["id"], $id);
	}

	function test_o_registro_inserido_deve_ser_o_mesmo_informado()
	{
		$novo = Qi_Db::select($this->tabela, array("id" => $this->pessoa["id"]))->current();
		$this->assertEquals($this->pessoa, $novo);
	}

	function test_update_nao_deve_alterar_colunas_nao_informadas_e_deve_retornar_o_id_alterado()
	{
		$id = Qi_Db::salvar($this->tabela, array("nome" => "teste"));
		$this->assertEquals(3, $id);
		$registro = Qi_Db::select($this->tabela, array("id" => $this->pessoa["id"]))->current();
		$registro["email"] = null;
		unset($registro["nome"]);
		$id = Qi_Db::salvar($this->tabela, $registro);
		$this->assertEquals(2, $id);
		$registro["nome"] = "marcos";
		$this->assertEquals($registro, Qi_Db::select($this->tabela, array("id" => $id))->current());
	}

	/**
	* O id retornado deve ser o do registro, mesmo que nenhum dado tenha seja alterado.
	*/
	function test_nao_deve_aceitar_campos_inexistentes()
	{
		$pessoa = $this->pessoa;
		$pessoa["nao_existo"] = "teste";
		$id = Qi_Db::salvar($this->tabela, $pessoa);
		$this->assertEquals($pessoa["id"], $id);
	}

	/**
	* Executa o teste
	*/
	public static function main()
	{
		require_once 'PHPUnit/TextUI/TestRunner.php';
        $suite  = new PHPUnit_Framework_TestSuite(__CLASS__);
        $result = PHPUnit_TextUI_TestRunner::run($suite);
	}
}

function sou_o_arquivo_executado()
{
	$included_files = get_included_files();
	$boot = realpath($included_files[0]);
	return realpath(__FILE__) === $boot;
}

if (sou_o_arquivo_executado())
	TestSalvar::main();

?>